/* eslint-disable no-unused-vars */

/**
 * @file 全局会使用的一些功能和函数
 */


/**
 * 全局配置
 */
var APP_CONFIG = {
  debug: 1,
};

/**
 * 用于调试时的打印
 */
var noop = function () { };
var originLog = console.log;

var log = console.log = noop;

if (APP_CONFIG.debug === 1) {
  log = console.log = originLog;
}

var Str = function (obj) {
  return JSON.stringify(obj, null, 2);
}

var asyncRequest = function (method, url, data, isWithCredentials) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    if (isWithCredentials) {
      xhr.withCredentials = true;
    }
    xhr.onreadystatechange = function () {
      // 通信成功时，状态值为4
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          resolve(xhr.responseText);
        } else {
          console.error(xhr.statusText);
          reject(xhr.statusText);
        }
      }
    };
    xhr.onerror = function () {
      console.error(xhr.statusText);
      reject(xhr.statusText);
    };

    var m = method.toUpperCase();
    xhr.open(m, url, true);
    xhr.send(data);
  });
}

var get = function (url) {
  return asyncRequest('get', url);
};

var post = function (url, data, isWithCredentials) {
  return asyncRequest('post', url, data, isWithCredentials);
}

var _e = function (selector) {
  return document.querySelector(selector);
}
var _es = function (selector) {
  return document.querySelectorAll(selector);
}

Element.prototype.on = Element.prototype.addEventListener;
Element.prototype.off = Element.prototype.removeEventListener;



/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 月(M)、日(d)、小时(H)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * 例子：
 * (new Date()).Format("yyyy-MM-dd HH:mm:ss.S") ==> 2006-07-02 08:09:04.423
 * (new Date()).Format("yyyy-M-d H:m:s.S")      ==> 2006-7-2 8:9:4.18
 *
 */

Date.prototype.Format = function (fmt) {
  var o = {
    "M+": this.getMonth() + 1,               // 月份
    "d+": this.getDate(),                    // 日
    "h+": this.getHours(),                   // 小时
    "m+": this.getMinutes(),                 // 分
    "s+": this.getSeconds(),                 // 秒
    "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
    "S": this.getMilliseconds()              // 毫秒
  };
  if (/(y+)/.test(fmt))
    fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
    if (new RegExp("(" + k + ")").test(fmt))
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}


/**
 * 对Array的扩展
 */

//  获取第一个元素
Object.defineProperty(Array.prototype, 'first', {
  value: function () {
    return this[0];
  },
});

// 获取最后一个元素
Object.defineProperty(Array.prototype, 'last', {
  value: function () {
    var len = this.length;
    return this[len - 1];
  },
});

/**
 * 浏览器环境检测
 */
var env = (function (ua) {
  var os = {};
  var browser = {};
  var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/);
  var firefox = ua.match(/Firefox\/([\d.]+)/);
  var ie = ua.match(/MSIE\s([\d.]+)/)
    // IE 11 Trident/7.0; rv:11.0
    || ua.match(/Trident\/.+?rv:(([\d.]+))/);
  var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+

  var weChat = (/micromessenger/i).test(ua);

  if (chrome) {
    browser.chrome = true;
    browser.version = chrome[1];
  }

  if (firefox) {
    browser.firefox = true;
    browser.version = firefox[1];
  }

  if (ie) {
    browser.ie = true;
    browser.version = ie[1];
  }

  if (edge) {
    browser.edge = true;
    browser.version = edge[1];
  }

  if (weChat) {
    browser.weChat = true;
  }

  return {
    browser: browser,
    os: os,
    node: false,
    canvasSupported: !!document.createElement('canvas').getContext,
    domSupported: typeof document !== 'undefined'
  };

})(navigator.userAgent);

if (env.browser.ie) {
  document.getElementById('app').style.display = 'none';
  alert('该系统不支持该浏览器，请使用谷歌或火狐');
}

/**
 *  生成一个延迟执行的函数, 在指定wait时间后才会执行
 * @param {*} fn 函数
 * @param {*} wait 等待时间
 */
var delay = function (fn, wait) {
  var timer;
  return function () {
    clearTimeout(timer);
    timer = setTimeout(fn, wait);
  }
}

function range(start, end, func) {
  var array = [];
  while (start < end) {
    let value = start;
    if (typeof func === 'function') {
      value = func(start);
    }
    array.push(value);
    start++;
  }
  return array;
}
